// 封装接口API  一个方法只负责请求一个接口url

// 文件里暴露的是myAxios变量，这里定义为request无影响，随便定义（限制默认暴露（一个文件只能有一个））
import request from '@/utils/requests'
// import store from '@/store' // js文件不能使用this拿到实例对象，若需要索使用什么就引入什么

// 定义api方法
// 注意：外部调用方法时传递的是一个对象，这里接收参数采用的是对象解构赋值，必须用大括号包起来
/**
 * 注册
 * @param {*} param0 {username：用户名，password：密码，repassword：确认密码}
 * @returns Promise对象
 */
export const registerAPI = ({ username, password, repassword }) => {
  // request就是引入的myAxios，内部已定义了基地址
  // request请求调用原地返回一个promise对象，需要return作用函数结果
  return request({
    url: '/api/reg',
    method: 'POST',
    // params的对象传参时，对象参数名和值，axios源码会把参数和值拼接在url？后面发给后台（query查询字符串）
    // data的对象传参时，对象参数名和值，axios源码会把参数和值拼接在请求体里（body参数）
    data: {
      // username, password, repassword
      // username,
      // password,
      // repassword
      // 简写形式要求：后台需要的变量名和此处定义的名字一致
      username,
      password,
      repassword
    }
  })
}

/**
 *
 * @param {*} param0 {username：用户名，password：密码}
 * @returns Promise对象
 */
export const loginAPI = ({ username, password }) => {
  return request({
    url: '/api/login',
    method: 'POST',
    data: {
      username,
      password
    }
  })
}

/**
 * 获取用户信息
 * @returns Promise对象
 */
export const getUserInfoAPI = () => {
  return request({
    url: '/my/userinfo'
    // method不写就是get
    // 传参给后台：params(查询字符串)，data(请求体body)，headers(请求头)  使用哪个看后端文档要求
    // 配置请求拦截器后就不需要了
    // headers: {
    //   // this.$store.state.token不能使用，这里是js文件，this不是组件实例对象
    //   Authorization: store.state.token
    // }

  })
}

/**
 * 获取-侧边栏菜单数据
 * @returns Promise对象
 */
export const getMenusAPI = () => {
  return request({
    url: '/my/menus'
    // 配置请求拦截器后就不需要了
    // headers: {
    //   Authorization: store.state.token
    // }
  })
}

/**
 * 修改个人资料信息
 * @param {*} param0 { id:i号, username:用户名, nickname:昵称, email:邮箱, user_pic:头像地址 }
 * @returns Promise
 */
export const updateUserInfoAPI = ({ id, username, nickname, email, user_pic }) => {
  return request({
    url: '/my/userinfo',
    method: 'PUT',
    // 发送给后台数据一共有三个地方,请求头  请求体  查询字符串(?后面)
    // 这里还要求传headers里的authorization携带token给后台,但是请求拦截器里已经统一携带了,这里就不用写了
    data: {
      id,
      username,
      nickname,
      email,
      user_pic
    }

  })
}
/**
 * 更新用户头像
 * @param {*} avatar 头像base64字符串
 * @returns Promise对象
 */
export const updateUserAvatarAPI = (avatar) => {
  return request({
    url: '/my/update/avatar',
    method: 'PATCH',
    data: {
      avatar
    }
  })
}

/**
 * 修改密码
 * @param {*} param0 {old_pwd:旧密码, new_pwd:新密码, re_pwd:确认密码}
 * @returns Promise对象
 */
export const updateUserPwdAPI = ({ old_pwd, new_pwd, re_pwd }) => {
  return request({
    url: '/my/updatepwd',
    method: 'PATCH',
    data: {
      old_pwd,
      new_pwd,
      re_pwd
    }
  })
}

/**
 * 请求分章分类
 * @returns Promise对象
 */
export const getArticleCateAPI = () => {
  return request({
    url: '/my/cate/list'
    // 默认get方法  请求头token值拦截器已携带
  })
}

/**
 * 添加文章分类
 * @param {*} param0 {cate_name:文章分类名称,cate_alias:文章分类别名}
 * @returns Promise对象
 */
export const addArticleAPI = ({ cate_name, cate_alias }) => {
  return request({
    url: '/my/cate/add',
    method: 'POST',
    data: {
      cate_name,
      cate_alias
    }
  })
}

/**
 * 修改文章分类
 * @param {*} param0 { id:文章分类id, cate_name:文章分类名称,cate_alias:文章分类别名   }
 * @returns Promise对象
 */
export const updateArticleAPI = ({ id, cate_name, cate_alias }) => {
  return request({
    url: '/my/cate/info',
    method: 'PUT',
    data: {
      id,
      cate_name,
      cate_alias
    }
  })
}

/**
 * 删除文章分类
 * @param {*} id 文章分类id
 * @returns Promise对象
 */
export const delArticleAPI = (id) => {
  return request({
    url: '/my/cate/del',
    method: 'DELETE',
    params: {
      id
    }
  })
}

/**
 * 发布文章
 * @param {*} param0 fd ===> 表单数据对象(文章标题,文章id,文章内容,文章封面,文章状态)
 * @returns Promise对象
 */
export const publishArticleAPI = (obj) => {
  return request({
    url: '/my/article/add',
    method: 'POST',
    // 后台要求参数要的是表单对象, 不能写普通对象(普通对象,axios会转为JSON字符串发给后台)
    // axios内部会判断, 如果是表单对象,传递的请求体会设置Content-Type: form-data与后端对应
    data: obj
  })
}

/**
 * 获取文章列表
 * @param {*} param0 { pagenum:当前页码数, pagesize:当前页面需要的数据条数, cate_id:文章分类id, state:文章状态 }
 * @returns Promise对象
 */
export const getArticleListAPI = ({ pagenum, pagesize, cate_id, state }) => {
  return request({
    url: '/my/article/list',
    params: {
      pagenum,
      pagesize,
      cate_id,
      state
    }
  })
}

/**
 * 获取文章详情
 * @param {*} id 具体文章的id
 * @returns Promise对象
 */
export const getArticleDetailAPI = (id) => {
  return request({
    url: '/my/article/info',
    params: {
      id
    }
  })
}

/**
 * 删除文章
 * @param {*} id 具体文章id
 * @returns Promise对象
 */
export const delArticleDataAPI = (id) => {
  return request({
    url: '/my/article/info',
    method: 'DELETE',
    params: {
      id
    }

  })
}

/*   headers: {Authorization: store.state.token}:在获取用户信息和获取侧边栏数据时都要携带请求体,
              如果请求的接口很多就要重复配置很多个,很麻烦,此时就需要使用axios请求拦截器和响应拦截器(自定义axios中配置)
*/
/*
  token过期后,要强制退出到登录页,但是前端的token值是一直存在的,无法判断token是否过期(后端判断)
  前端必须根据后端判断返回的状态码(401)来进行操作(因为每个页面都需要,使用响应拦截器统一判断)
*/
